<?php

namespace App\Providers;

use App\Models\System\User;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Boot the authentication services for the application.
     *
     * @return void
     */
    public function boot()
    {
        // Here you may define how you wish users to be authenticated for your Lumen
        // application. The callback which receives the incoming request instance
        // should return either a User instance or null. You're free to obtain
        // the User instance via an API token or any other method necessary.

        $this->app['auth']->viaRequest('api', function ($request) {
            //从缓存中获取用户信息
            $token = $request->bearerToken();
            if ($token){
                $cacheData = Cache::get("api_token:".$token);
                if ($cacheData){
                    $user = User::query()->find($cacheData['id'] ?? 0);
                    //新的权限定义
                    Gate::define('rbac', function(User $user, $routeName){
                        return $user->hasPermissionByPermName($routeName);
                    });
                    return $user;
                }
            }
        });
    }
}
